home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 015 / prn2dsk.arc / FSPOOL.ASM < prev    next >
Encoding:
Assembly Source File  |  1985-03-29  |  7.7 KB  |  352 lines

  1.     TITLE    FSPOOL - FSPOOL PRINTER TO DISK
  2.     PAGE    64,132
  3. COMMENT *
  4.     FSPOOL: THIS DOS COMMAND SPOOLS EVERYTHING WHICH GOES TO THE
  5.         PARALLEL PRINTER TO A DISK FILE. DATA IS COLLECTED UNTIL
  6.         A SECOND FSPOOL COMMAND IS ISSUED.
  7.  
  8.            FORMAT:
  9.             FSPOOL <FILENAME>
  10.  
  11.             IF NO <FILENAME> IS GIVEN, THE PREVIOUS FILE IS
  12.             CLOSED AND ALL FURTHER PRINTER DATA GOES TO THE
  13.             PRINTER.
  14.  
  15.     PROGRAMMER: DON D WORTH - UCLA/OAC - 1/5/84
  16.  
  17.     ENTRY POINTS: +100 = STANDARD INITIAL COMMAND ENTRY
  18.               +103 = PRINTER INTERRUPT ENTRY POINT
  19.  
  20.     TO LINK:    LINK FSPOOL,FSPOOL,FSPOOL;
  21.             DEBUG FSPOOL.EXE
  22.             N FSPOOL.COM
  23.             W
  24.             Q
  25.  
  26.     *
  27. BUFSIZ    EQU    200H        ;SIZE OF DMA BUFFER
  28. ;
  29. CONOUT    EQU    02H        ; CONSOLE OUTPUT
  30. PRINT    EQU    09H        ; PRINT STRING
  31. OPEN    EQU    0FH        ; OPEN FILE
  32. CLOSE    EQU    10H        ; CLOSE FILE
  33. DELETE    EQU    13H        ; DELETE FILE
  34. MAKE    EQU    16H        ; MAKE FILE
  35. SETDMA    EQU    1AH        ; SET DMA ADDRESS
  36. WRITER    EQU    22H        ; RANDOM WRITE
  37. GETDMA    EQU    2FH        ; GET DMA ADDRESS
  38. ;
  39. BELL    EQU    07H        ;BELL
  40. CR    EQU    0DH        ;CARRIAGE RETURN
  41. LF    EQU    0AH        ;LINE FEED
  42. SPACE    EQU    20H        ;SPACE
  43. ;
  44. PGM    GROUP    ASEG,CSEG,DSEG
  45.     ASSUME    CS:PGM,DS:PGM
  46. ;
  47. ;    PREFIX SEGMENT
  48. ;
  49. ASEG    SEGMENT PARA COMMON 'CODE'
  50. INT20    LABEL    NEAR
  51.     DW    ?
  52. MEMSIZ    DW    ?        ;TOTAL MEMORY SIZE
  53.     DB    ?
  54. BDOS    LABEL    NEAR
  55.     DB    5 DUP(?)    ;LONG CALL TO DOS
  56. TERMAD    DW    ?,?        ;TERMINATE ADDRESS
  57. CTLBRK    DW    ?,?        ;CONTROL-BREAK EXIT
  58.     DW    37 DUP(?)    ;RESERVED
  59. FCB1    DB    16 DUP(?)    ;FIRST FCB
  60. FCB2    DB    16 DUP(?)    ;SECOND FCB
  61.     DW    ?,?        ;RESERVED
  62. DMA    DB    128 DUP(?)    ;DMA SECTOR BUFFER
  63. ;
  64. ASEG    ENDS
  65. ;
  66. ;    DATA SEGMENT
  67. ;
  68. DSEG    SEGMENT PARA PUBLIC 'DATA'
  69. ;
  70. MSG    DB    CR,LF,'FSPOOL INSTALLED',CR,LF,'$'
  71. MSGOPN    DB    CR,LF,'NO ROOM IN DIRECTORY FOR FSPOOL FILE',BELL,CR,LF,'$'
  72. ;
  73. DSEG    ENDS
  74. ;
  75. ;    START OF CODE
  76. ;
  77. CSEG    SEGMENT PARA PUBLIC 'CODE'
  78. ;
  79. ;    NORMAL COMMAND ENTRY
  80. ;
  81. FSPOOL: JMP    INIT            ;GO TO INIT CODE
  82. ;
  83. ;    PARALLEL PRINTER INTERRUPT EXIT - INT 17H
  84. ;
  85. INTENT: STI                ;INTERRUPTS BACK ON
  86.     PUSH    DS
  87.     PUSH    BX
  88.     PUSH    CX
  89.     PUSH    DX
  90.     PUSH    SI
  91.     PUSH    DI
  92.     PUSH    AX
  93.     MOV    SI,CS
  94.     MOV    DS,SI            ;SET UP DATA SEGMENT
  95.     CMP    BYTE PTR FLAG,0     ;IS FILE AVAILABLE?
  96.     JNZ    MYINT            ;YES, GO ON
  97.     POP    AX
  98.     POP    DI
  99.     POP    SI
  100.     POP    DX
  101.     POP    CX
  102.     POP    BX
  103.     POP    DS
  104.     JMP    DWORD PTR CS:VEC    ;ELSE, GO TO REAL EXIT
  105. ;
  106. MYINT:    OR    AH,AH            ;AH=0 : PRINT CHARACTER IN AL
  107.     JNZ    INTEXT
  108.     MOV    SI,SS
  109.     MOV    WORD PTR STKSAV+2,SI    ;SAVE CALLER'S STACK
  110.     MOV    SI,SP
  111.     MOV    WORD PTR STKSAV,SI
  112.     MOV    SI,CS
  113.     MOV    SS,SI            ;GIVE ME NEW BIGGER STACK
  114.     MOV    SI,OFFSET PGM:STK
  115.     MOV    SP,SI
  116.     CALL    PRNT            ;PRINT THE CHARACTER
  117.     MOV    SI,WORD PTR STKSAV
  118.     MOV    SP,SI            ;RESTORE CALLER'S STACK
  119.     MOV    SI,WORD PTR STKSAV+2
  120.     MOV    SS,SI
  121. ;
  122. INTEXT: POP    AX            ;ALL OTHERS PRODUCE ZERO RC
  123.     MOV    AH,90H            ;SIMULATE BUSY/SELECTED
  124.     POP    DI
  125.     POP    SI
  126.     POP    DX
  127.     POP    CX
  128.     POP    BX
  129.     POP    DS
  130.     IRET
  131. ;
  132. ;    ADD CHARACTER TO PRINT BUFFER
  133. ;
  134. PRNT:    CMP    BYTE PTR FLAG,0     ;MAKE SURE A FILE IS AVAIL.
  135.     JZ    INTEXT
  136.     PUSH    AX
  137.     CMP    WORD PTR LEFT,BUFSIZ    ;BUFFER FULL?
  138.     JNE    INTADD            ;NO
  139.     CALL    FLUSH            ;YES, FLUSH BUFFER
  140. INTADD: POP    AX
  141.     MOV    BX,WORD PTR LEFT
  142.     ADD    BX,OFFSET PGM:BUFFER
  143.     MOV    [BX],AL         ;MOVE BYTE TO BUFFER
  144.     INC    WORD PTR LEFT
  145. RET:    RET                ;DONE FOR NOW
  146. ;
  147. ;    FLUSH PRINT BUFFER TO DISK FILE
  148. ;
  149. FLUSH:    XOR    AX,AX
  150.     CMP    AX,WORD PTR DS:LEFT    ;BUFFER NON-EMPTY?
  151.     JE    RET            ;EMPTY, SKIP IT
  152.     MOV    WORD PTR DS:LEFT,AX    ;ELSE, RESET IT
  153. ;
  154.     PUSH    ES
  155.     PUSH    DS
  156. ;
  157. ;    EL KLUDGEO: PRESERVE A CHUNK OF DOS 2.0 ACROSS INT 21H
  158. ;
  159.     MOV    AX,DS            ;COPY TO MY SEGMENT
  160.     MOV    ES,AX
  161.     MOV    AX,DS:STKSAV+2        ;COPYING FROM CALLER'S STACK
  162.     MOV    DS,AX
  163.     MOV    SI,0            ;MAGIC OFFSET TO DOS'S STACK
  164.     MOV    DI,(OFFSET PGM:DOSSTK)
  165.     MOV    CX,0C80H        ;LENGTH TO SAVE
  166.     CLD
  167.     REP    MOVSB            ;COPY DOS'S STACK
  168.     POP    DS
  169.     PUSH    DS
  170. ;
  171.     MOV    AH,GETDMA
  172.     INT    21H
  173.     PUSH    ES            ;SAVE OLD DMA ADDR
  174.     PUSH    BX
  175.     MOV    DX,OFFSET PGM:BUFFER
  176.     MOV    AH,SETDMA
  177.     INT    21H            ;SET UP MY DMA
  178.     MOV    DX,OFFSET PGM:FCB
  179.     MOV    AH,OPEN
  180.     INT    21H            ;REOPEN FILE
  181. ;
  182.     MOV    AX,WORD PTR DS:CURREC
  183.     MOV    WORD PTR DS:FCB+33,AX       ;SET NEW RECORD TO WRITE
  184.     MOV    WORD PTR DS:FCB+14,BUFSIZ  ;AND RECORD SIZE
  185.     MOV    DX,OFFSET PGM:FCB
  186.     MOV    AH,WRITER
  187.     INT    21H            ;WRITE BUFFER TO DISK
  188.     OR    AL,BYTE PTR DS:SAVE    ;SAVE RC
  189.     MOV    BYTE PTR DS:SAVE,AL
  190.     INC    WORD PTR DS:CURREC    ;NEXT RECORD NEXT TIME
  191. ;
  192.     MOV    DX,OFFSET PGM:FCB
  193.     MOV    AH,CLOSE
  194.     INT    21H            ;CLOSE THE FILE TO FLUSH BUFFS
  195.     POP    DX
  196.     POP    DS
  197.     MOV    AH,SETDMA        ;RESTORE OLD DMA
  198.     INT    21H
  199. ;
  200.     POP    DS
  201.     POP    ES
  202. ;
  203.     CMP    BYTE PTR DS:SAVE,'0'    ;DID IT WORK?
  204.     JNE    IOERR
  205. ;
  206. FLHOUT: MOV    AX,DS:STKSAV+2        ;COPYING TO DOS'S WORKAREA
  207.     CMP    AX,100H
  208.     JA    FRET            ;MUST BE DOS'S SEGMENT
  209.     PUSH    ES
  210.     MOV    ES,AX
  211.     MOV    DI,0            ;RESTORE DATA AREAS
  212.     MOV    SI,(OFFSET PGM:DOSSTK)
  213.     MOV    CX,0C80H        ;LENGTH TO RESTORE
  214.     CLD
  215.     REP    MOVSB            ;COPY DOS'S STACK
  216.     POP    ES            ;RESTORE ES
  217. FRET:    RET
  218. ;
  219. IOERR:    XOR    AX,AX
  220.     INT    10H            ;CLEAR SCREEN
  221.     MOV    SI,(OFFSET PGM:MSGERR)
  222. MSGLP:    MOV    AL,[SI]         ;GET NEXT CHARACTER
  223.     CMP    AL,'$'                  ;END OF MESSAGE?
  224.     JE    IOEOUT
  225.     XOR    BX,BX            ;NO...
  226.     MOV    AH,14
  227.     INT    10H            ;WRITE CHARACTER
  228.     INC    SI
  229.     JMP    MSGLP
  230. IOEOUT: MOV    BYTE PTR DS:FLAG,0    ;MARK FILE CLOSED
  231.     JMP    FLHOUT
  232. ;
  233. ;    PERMANENT DATA AREA (ALWAYS USE DS: FROM CODE BELOW)
  234. ;
  235. FLAG    DB    0        ;FILE OPEN FLAG
  236. FCB    DB    37 DUP(0)    ;FILE CONTROL BLOCK
  237. MSGERR    DB    BELL,BELL,BELL,'FSPOOL WRITE ERROR - '
  238. SAVE    DB    '0$'
  239. VEC    DD    0        ;OLD PRINT INT HANDLER
  240. LEFT    DW    0        ;BYTES LEFT IN DMA BUFFER
  241. CURREC    DW    0        ;CURRENT RECORD TO WRITE
  242. BUFFER    DB    BUFSIZ DUP(?)    ;WRITE BUFFER
  243. DOSSTK    DB    0C80H DUP(?)    ;PLACE TO SAVE INT 21H'S STACK
  244. STKSAV    DD    0        ;CALLER'S STACK EA
  245.     DB    64 DUP('STACK   ')
  246. STK    EQU    THIS BYTE
  247. ;
  248. ;    SEE IF A FILE IS ALREADY OPEN
  249. ;
  250. INIT:    CALL    CHKVEC            ;FIND PREVIOUS WORKAREA
  251.     CMP    BYTE PTR DS:FLAG,0    ;FILE OPEN OR CLOSED?
  252.     JE    NOCLS            ;CLOSED, NO CLOSE NEEDED
  253.     MOV    AL,1AH
  254.     MOV    WORD PTR DS:STKSAV+2,AX ;MAKE SURE WE DON'T RESTORE STUFF
  255.     CALL    PRNT            ;PRINT END OF FILE MARK
  256.     CALL    FLUSH            ;FLUSH OUT WRITE BUFFER
  257.     MOV    BYTE PTR DS:FLAG,0    ;NO LONGER OPEN
  258. ;
  259. ;    COPY NEW FCB1 TO PERMANENT FCB
  260. ;
  261. NOCLS:    CMP    BYTE PTR ES:FCB1+1,20H    ;BLANK FILENAME?
  262.     JE    INSTAL            ;THEN DON'T OPEN IT
  263.     MOV    SI,(OFFSET PGM:FCB1)
  264.     MOV    DI,(OFFSET PGM:FCB)
  265.     MOV    CX,35            ;LENGTH OF AN FCB
  266.     PUSH    ES
  267.     PUSH    DS
  268.     POP    ES            ;SWAP SEGMENTS
  269.     POP    DS
  270.     CLD
  271.     REP    MOVSB            ;MOVE IT
  272.     PUSH    ES
  273.     PUSH    DS
  274.     POP    ES
  275.     POP    DS            ;SWAP SEGMENTS BACK
  276. ;
  277. ;    OPEN NEW FCB
  278. ;
  279.     MOV    DX,(OFFSET PGM:FCB)
  280.     MOV    AH,DELETE
  281.     INT    21H            ;DELETE OLD FILE
  282.     MOV    DX,(OFFSET PGM:FCB)
  283.     MOV    AH,MAKE
  284.     INT    21H            ;CREATE IT
  285.     CMP    AL,0FFH
  286.     JNE    ITSOPN            ;ALL WENT WELL?
  287.     MOV    DX,(OFFSET PGM:MSGOPN)
  288.     MOV    AH,PRINT
  289.     INT    21H            ;'OPEN FAILED'
  290.     XOR    AX,AX
  291.     INT    21H            ;TERMINATE
  292. ;
  293. ;    SET UP OPEN FILE, CLEAR BUFFER
  294. ;
  295. ITSOPN: MOV    BYTE PTR DS:FLAG,0FFH    ;MARK FILE AS OPEN
  296.     MOV    WORD PTR DS:CURREC,0    ;RESET CURRENT RECORD
  297.     MOV    WORD PTR DS:LEFT,0    ;NOTHING IN WRITE BUFFER NOW
  298. ;
  299.     MOV    AH,CLOSE
  300.     MOV    DX,(OFFSET PGM:FCB)
  301.     INT    21H            ;CLOSE FILE UNTIL WE NEED IT
  302. ;
  303. ;    INSTALL PRINT INTERCEPT IF NECESSARY
  304. ;
  305. INSTAL: CALL    CHKVEC            ;IS ONE ALREADY INSTALLED?
  306.     JE    EXIT            ;YES, NOTHING ELSE TO DO
  307.     PUSH    DS
  308.     XOR    AX,AX
  309.     MOV    DS,AX
  310.     MOV    AX,WORD PTR DS:005CH    ;SAVE OLD VECTOR
  311.     MOV    WORD PTR CS:VEC,AX
  312.     MOV    AX,WORD PTR DS:005EH
  313.     MOV    WORD PTR CS:VEC+2,AX
  314.     MOV    AX,(OFFSET PGM:INTENT)
  315.     MOV    WORD PTR DS:005CH,AX    ;INSTALL PARALLEL INT
  316.     MOV    AX,CS
  317.     MOV    WORD PTR DS:005EH,AX
  318.     POP    DS
  319. ;
  320.     MOV    DX,OFFSET PGM:MSG
  321.     MOV    AH,PRINT
  322.     INT    21H            ;'FSPOOL INSTALLED'
  323. ;
  324. ;    EXIT LEAVING ME IN MEMORY
  325. ;
  326.     MOV    DX,OFFSET PGM:INIT
  327.     INT    27H            ;EXIT BUT STAY RESIDENT
  328. ;
  329. ;    EXIT NORMALLY
  330. ;
  331. EXIT:    MOV    AX,CS            ;PUT BACK SEGMENT
  332.     MOV    DS,AX
  333.     XOR    AX,AX
  334.     INT    21H            ;EXIT COMPLETELY
  335. ;
  336. ;    CHECK PARALLEL PRINTER VECTOR FOR INTERCEPT
  337. ;
  338. CHKVEC: XOR    AX,AX            ;CHECK INT VECTORS
  339.     MOV    DS,AX            ;FOR PARALLEL PRINTER
  340.     MOV    AX,WORD PTR DS:005CH    ;GET OFFSET PART
  341.     CMP    AX,(OFFSET PGM:INTENT)    ;SAME AS MY INTERCEPT'S
  342.     JE    SETES            ;IF SO, USE OLD COPY
  343.     MOV    AX,CS            ;RESTORE DS REG
  344.     MOV    DS,AX
  345.     RET
  346. SETES:    MOV    AX,WORD PTR DS:005EH    ;GET SEGMENT OF OTHER ME
  347.     MOV    DS,AX            ;AND USE IT INSTEAD
  348.     RET                ; CS: AND ES: REMAIN THE SAME
  349. ;
  350. CSEG    ENDS
  351.     END
  352.